//----------------------------------------
//
// Copyright © yanghy. All Rights Reserved.
//
// Licensed under Apache License Version 2.0, January 2004
//
// https://www.apache.org/licenses/LICENSE-2.0
//
//----------------------------------------

package cef

import (
	"github.com/energye/energy/v2/cef/internal/def"
	"github.com/energye/energy/v2/common/imports"
	"github.com/energye/energy/v2/consts"
	"github.com/energye/energy/v2/types"
)

type IChromiumOptions interface {
	Javascript() consts.TCefState
	JavascriptCloseWindows() consts.TCefState
	JavascriptAccessClipboard() consts.TCefState
	JavascriptDomPaste() consts.TCefState
	ImageLoading() consts.TCefState
	ImageShrinkStandaloneToFit() consts.TCefState
	TextAreaResize() consts.TCefState
	TabToLinks() consts.TCefState
	LocalStorage() consts.TCefState
	Databases() consts.TCefState
	Webgl() consts.TCefState
	BackgroundColor() types.TCefColor
	AcceptLanguageList() types.String // Remove CEF 118
	WindowlessFrameRate() types.Integer
	ChromeStatusBubble() consts.TCefState
	SetJavascript(value consts.TCefState)
	SetJavascriptCloseWindows(value consts.TCefState)
	SetJavascriptAccessClipboard(value consts.TCefState)
	SetJavascriptDomPaste(value consts.TCefState)
	SetImageLoading(value consts.TCefState)
	SetImageShrinkStandaloneToFit(value consts.TCefState)
	SetTextAreaResize(value consts.TCefState)
	SetTabToLinks(value consts.TCefState)
	SetLocalStorage(value consts.TCefState)
	SetDatabases(value consts.TCefState)
	SetWebgl(value consts.TCefState)
	SetBackgroundColor(value types.TCefColor)
	SetAcceptLanguageList(value types.String) // Remove CEF 118
	SetWindowlessFrameRate(value types.Integer)
	SetChromeStatusBubble(value consts.TCefState)
	ChromeZoomBubble() consts.TCefState
	SetChromeZoomBubble(value consts.TCefState)
}

func NewChromiumOptions(chromium IChromium) IChromiumOptions {
	return &TChromiumOptions{
		javascript:                 consts.STATE_DEFAULT,
		javascriptCloseWindows:     consts.STATE_DEFAULT,
		javascriptAccessClipboard:  consts.STATE_DEFAULT,
		javascriptDomPaste:         consts.STATE_DEFAULT,
		imageLoading:               consts.STATE_DEFAULT,
		imageShrinkStandaloneToFit: consts.STATE_DEFAULT,
		textAreaResize:             consts.STATE_DEFAULT,
		tabToLinks:                 consts.STATE_DEFAULT,
		localStorage:               consts.STATE_DEFAULT,
		databases:                  consts.STATE_DEFAULT,
		webgl:                      consts.STATE_DEFAULT,
		backgroundColor:            0,
		acceptLanguageList:         "", // Remove CEF 118
		windowlessFrameRate:        consts.CEF_OSR_FRAMERATE_DEFAULT,
		chromeStatusBubble:         consts.STATE_DEFAULT,
		Chromium:                   chromium,
	}
}

func (m *TChromiumOptions) Javascript() consts.TCefState {
	return m.javascript
}

func (m *TChromiumOptions) JavascriptCloseWindows() consts.TCefState {
	return m.javascriptCloseWindows
}

func (m *TChromiumOptions) JavascriptAccessClipboard() consts.TCefState {
	return m.javascriptAccessClipboard
}

func (m *TChromiumOptions) JavascriptDomPaste() consts.TCefState {
	return m.javascriptDomPaste
}

func (m *TChromiumOptions) ImageLoading() consts.TCefState {
	return m.imageLoading
}

func (m *TChromiumOptions) ImageShrinkStandaloneToFit() consts.TCefState {
	return m.imageShrinkStandaloneToFit
}

func (m *TChromiumOptions) TextAreaResize() consts.TCefState {
	return m.textAreaResize
}

func (m *TChromiumOptions) TabToLinks() consts.TCefState {
	return m.tabToLinks
}

func (m *TChromiumOptions) LocalStorage() consts.TCefState {
	return m.localStorage
}

func (m *TChromiumOptions) Databases() consts.TCefState {
	return m.databases
}

func (m *TChromiumOptions) Webgl() consts.TCefState {
	return m.webgl
}

func (m *TChromiumOptions) BackgroundColor() types.TCefColor {
	return m.backgroundColor
}

// AcceptLanguageList Remove CEF 118
func (m *TChromiumOptions) AcceptLanguageList() types.String {
	return m.acceptLanguageList
}

func (m *TChromiumOptions) WindowlessFrameRate() types.Integer {
	return m.windowlessFrameRate
}

func (m *TChromiumOptions) ChromeStatusBubble() consts.TCefState {
	return m.chromeStatusBubble
}

// setting

func (m *TChromiumOptions) SetJavascript(value consts.TCefState) {
	m.javascript = value
	imports.Proc(def.ChromiumOptions_SetJavascript).Call(m.Chromium.Instance(), value.ToPtr())
}

func (m *TChromiumOptions) SetJavascriptCloseWindows(value consts.TCefState) {
	m.javascriptCloseWindows = value
	imports.Proc(def.ChromiumOptions_SetJavascriptCloseWindows).Call(m.Chromium.Instance(), value.ToPtr())
}

func (m *TChromiumOptions) SetJavascriptAccessClipboard(value consts.TCefState) {
	m.javascriptAccessClipboard = value
	imports.Proc(def.ChromiumOptions_SetJavascriptAccessClipboard).Call(m.Chromium.Instance(), value.ToPtr())
}

func (m *TChromiumOptions) SetJavascriptDomPaste(value consts.TCefState) {
	m.javascriptDomPaste = value
	imports.Proc(def.ChromiumOptions_SetJavascriptDomPaste).Call(m.Chromium.Instance(), value.ToPtr())
}

func (m *TChromiumOptions) SetImageLoading(value consts.TCefState) {
	m.imageLoading = value
	imports.Proc(def.ChromiumOptions_SetImageLoading).Call(m.Chromium.Instance(), value.ToPtr())
}

func (m *TChromiumOptions) SetImageShrinkStandaloneToFit(value consts.TCefState) {
	m.imageShrinkStandaloneToFit = value
	imports.Proc(def.ChromiumOptions_SetImageShrinkStandaloneToFit).Call(m.Chromium.Instance(), value.ToPtr())
}

func (m *TChromiumOptions) SetTextAreaResize(value consts.TCefState) {
	m.textAreaResize = value
	imports.Proc(def.ChromiumOptions_SetTextAreaResize).Call(m.Chromium.Instance(), value.ToPtr())
}

func (m *TChromiumOptions) SetTabToLinks(value consts.TCefState) {
	m.tabToLinks = value
	imports.Proc(def.ChromiumOptions_SetTabToLinks).Call(m.Chromium.Instance(), value.ToPtr())
}

func (m *TChromiumOptions) SetLocalStorage(value consts.TCefState) {
	m.localStorage = value
	imports.Proc(def.ChromiumOptions_SetLocalStorage).Call(m.Chromium.Instance(), value.ToPtr())
}

func (m *TChromiumOptions) SetDatabases(value consts.TCefState) {
	m.databases = value
	imports.Proc(def.ChromiumOptions_SetDatabases).Call(m.Chromium.Instance(), value.ToPtr())
}

func (m *TChromiumOptions) SetWebgl(value consts.TCefState) {
	m.webgl = value
	imports.Proc(def.ChromiumOptions_SetWebgl).Call(m.Chromium.Instance(), value.ToPtr())
}

func (m *TChromiumOptions) SetBackgroundColor(value types.TCefColor) {
	m.backgroundColor = value
	imports.Proc(def.ChromiumOptions_SetBackgroundColor).Call(m.Chromium.Instance(), value.ToPtr())
}

// SetAcceptLanguageList Remove CEF 118
func (m *TChromiumOptions) SetAcceptLanguageList(value types.String) {
	m.acceptLanguageList = value
	imports.Proc(def.ChromiumOptions_SetAcceptLanguageList).Call(m.Chromium.Instance(), value.ToPtr())
}

func (m *TChromiumOptions) SetWindowlessFrameRate(value types.Integer) {
	m.windowlessFrameRate = value
	imports.Proc(def.ChromiumOptions_SetWindowlessFrameRate).Call(m.Chromium.Instance(), value.ToPtr())
}

func (m *TChromiumOptions) SetChromeStatusBubble(value consts.TCefState) {
	m.chromeStatusBubble = value
	imports.Proc(def.ChromiumOptions_SetChromeStatusBubble).Call(m.Chromium.Instance(), value.ToPtr())
}

func (m *TChromiumOptions) ChromeZoomBubble() consts.TCefState {
	r1, _, _ := imports.Proc(def.ChromiumOptions_ChromeZoomBubble).Call(consts.GetValue, m.Chromium.Instance(), 0)
	return consts.TCefState(r1)
}

func (m *TChromiumOptions) SetChromeZoomBubble(value consts.TCefState) {
	imports.Proc(def.ChromiumOptions_ChromeZoomBubble).Call(consts.SetValue, m.Chromium.Instance(), uintptr(value))
}
